package org.example.java8time;

import org.junit.Test;

import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @Classname LocalDateTest
 * @Description LocalDate api
 * @Date 2021/2/4 2:33 下午
 * @Created by xiangjd
 */
public class LocalDateTest {

    /**
     * 获取当前日期
     */
    @Test
    public void test1(){
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);
    }

    /**
     * 设置日期
     */
    @Test
    public void test2(){
        LocalDate localDate = LocalDate.of(2019,1,7);
        System.out.println(localDate);
    }

    /**
     * 获取当前日期是所在月的第几天
     * 获取当前日期是星期几（星期的英文全称）
     * 获取当前日期是所在年的第几天
     * 获取当前日期所在月份（月份的英文全称）
     * 获取当前日期所在月份的数值
     * 获取当前日期所在月份有多少天
     * 获取当前日期所在年有多少天
     * 获取当前日期所在年是否是闰年
     *
     * 将参数中的"日"替换localDate中的"日"
     * 将参数中的天数替换localDate中的天数
     * 将参数中的"月"替换localDate中的"月"
     * 将参数中的"年"替换localDate中的"年"
     *
     * 将当前日期减一天
     * 将当前日期减一周
     * 将当前日期减一月
     * 将当前日期减一年
     * 将当前日期加一天
     * 将当前日期加一周
     * 将当前日期加一月
     * 将当前日期加一年
     */
    @Test
    public void test3(){
        LocalDate localDate = LocalDate.of(2021,2,4);
        System.out.println(localDate.getDayOfMonth());
        System.out.println(localDate.getDayOfWeek());
        System.out.println(localDate.getDayOfYear());
        System.out.println(localDate.getMonth());
        System.out.println(localDate.getMonthValue());
        System.out.println(localDate.lengthOfMonth());
        System.out.println(localDate.lengthOfYear());
        System.out.println(localDate.isLeapYear());

        System.out.println(localDate.withDayOfMonth(2));
        System.out.println(localDate.withDayOfYear(40));
        System.out.println(localDate.withMonth(2));
        System.out.println(localDate.withYear(2020));

        System.out.println(localDate.minusDays(1));
        System.out.println(localDate.minusMonths(1));
        System.out.println(localDate.minusWeeks(1));
        System.out.println(localDate.minusYears(1));
        System.out.println(localDate.plusDays(1));
        System.out.println(localDate.plusMonths(1));
        System.out.println(localDate.plusWeeks(1));
        System.out.println(localDate.plusYears(1));


    }

    /**
     * localDate转string
     * String转localDate
     * localDate转Date
     * Date转localDate
     */
    @Test
    public void test4(){
        String format = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println(format);

        LocalDate parse = LocalDate.parse("2020-01-17", DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println(parse);

        Date date = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
        System.out.println(date);

        LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        System.out.println(localDate);
    }

    /**
     * 2个localDate之间相差多少
     *
     * ps 看了下面的日志信息，明白是怎么回事了吧。
     * Period中时间区间如果是1年5个月3天。那么通过getDays()方法获得就是第三个存储3天。而不是1年5个月3天总共有多少天。
     */
    @Test
    public void test5() {
        LocalDate from = LocalDate.of(2019, 9, 1);
        Period period = Period.between(from, LocalDate.now());
        System.out.println("2019-09-01到当前日期" + LocalDate.now());
        System.out.println("距离当前多少年：" + period.getYears());
        System.out.println("距离当前多少月：" + period.getMonths());
        System.out.println("距离当前多少日：" + period.getDays());

        //那么如果想算两个日期直接的距离该怎么办呢？可采用下面的方法。
        long day = LocalDate.now().toEpochDay() - from.toEpochDay();
        System.out.println("距离当前多少日：" + day);


    }
}
